package com.wugh.fast.kernel.util.recursive;

import cn.hutool.core.exceptions.ExceptionUtil;
import cn.hutool.core.lang.func.VoidFunc0;

import java.util.Collection;
import java.util.function.*;
import java.util.stream.Stream;

/**
 * 说明:
 *
 * @author wugh
 * @date 2019-12-11 15:20
 */
public interface Recursive<T, R> {
    /**
     * 回调方法
     *
     * @param function
     * @return
     */
    Recursive<T, R> function(Function<T, R> function);

    /**
     * 递归的判断条件
     *
     * @return
     */
    Recursive<T, R> test(BiPredicate<T, R> predicate);

    /**
     * 数据处理
     *
     * @param map
     * @return
     */
    Recursive<T, R> map(BiFunction<T, R, T> map);

    /**
     * 数据合并方法
     *
     * @param reduce
     * @return
     */
    Recursive<T, R> reduce(BinaryOperator<R> reduce);

    /**
     * 数据合并方法
     *
     * @param identity 默认值
     * @param reduce
     * @return
     */
    Recursive<T, R> reduce(R identity, BinaryOperator<R> reduce);

    /**
     * @param value
     * @return
     */
    R exec(T value);
}
